package ch01
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.GradientType;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.MouseEvent;
	import flash.filters.GlowFilter;
	import flash.geom.Matrix;
	import flash.geom.Point;
	
	import tools.Star;
	/**
	 * 检测带透明的不规则图形之间的碰撞 (五角星)
	 * @author jianping.shenjp
	 * 
	 */
	public class BitmapCollision2 extends Sprite
	{
		private var bmpd1:BitmapData;
		private var bmp1:Bitmap;
		private var bmpd2:BitmapData;
		private var bmp2:Bitmap;

		public function BitmapCollision2()
		{
			stage.align=StageAlign.TOP_LEFT;
			stage.scaleMode=StageScaleMode.NO_SCALE;
			// make a star
			var star:Star=new Star(50);
			// make a gradient circle
			var matrix:Matrix=new Matrix();
			matrix.createGradientBox(100, 100, 0, -50, -50);
			var circle:Sprite=new Sprite();
			circle.graphics.beginGradientFill(GradientType.RADIAL, [0x000000, 0x000000], [1, 0], [0, 255], matrix);
			circle.graphics.drawCircle(0, 0, 50);
			circle.graphics.endFill();
			// make a fixed bitmap, draw the star into it
			bmpd1=new BitmapData(100, 100, true, 0x00000000);
			bmpd1.draw(star, new Matrix(1, 0, 0, 1, 50, 50));
			bmp1=new Bitmap(bmpd1);
			bmp1.x=200;
			bmp1.y=200;
			addChild(bmp1);
			// make a moveable bitmap, draw the star into it, too
			bmpd2=new BitmapData(100, 100, true, 0);
			bmpd2.draw(circle, new Matrix(1, 0, 0, 1, 50, 50));
			bmp2=new Bitmap(bmpd2);
			addChild(bmp2);
			stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoving);
		}

		private function onMouseMoving(event:MouseEvent):void
		{
			// move bmp2 to the mouse position (centered).
			bmp2.x=mouseX - 50;
			bmp2.y=mouseY - 50;
			/**
			 * 把透明阈值调低一点试试：
			 * if(bmpd1.hitTest(new Point(bmp1.x, bmp1.y), 255, bmpd2, new Point(bmp1.x, bmp1.y), 128))
			 *	现在移动圆到星星上，要使碰撞发生，接触的像素的透明值至少要128。可以试着改变第二个透明阈值看看不同的效果。
			 * 注意，如果设置为0，碰撞会发生在圆还 没有接触到星星的时候，这是因为星星接触到了位图上完全透明的像素。
			 * 记住位图本身是一个矩形，只不过透明了看不到而已。
			 * 同时注意，由于绘制星星的位图，像素值要么完全透明，要么完全不透明，所以改变第一个透明阈值（除了0以外）不会有影响。
			 * */
			// the hit test itself.
			if (bmpd1.hitTest(new Point(bmp1.x, bmp1.y), 0xFF, bmpd2, new Point(bmp2.x, bmp2.y), 0xFF))
			{
				trace("hit.........");
				bmp1.filters=[new GlowFilter()];
				bmp2.filters=[new GlowFilter()];
			}
			else
			{
				bmp1.filters=[];
				bmp2.filters=[];
			}
		}
	}
}